package com.loyal.loyalerp.commons;

import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;

/**
 * 一个通用的，可高复用的响应数据类
 * 
 * @param <T>
 *            使用泛型是为了适应多种数据类型
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
// 如果对象的 value 为 null， 比如 data， 那么key也为null
public class ServerResponse<T> implements Serializable {
	private static final long serialVersionUID = 1L;
	private int status;
	private String message;
	private T data;

	private ServerResponse(int status) {
		this.status = status;
	}

	private ServerResponse(int status, String message) {
		this(status);
		this.message = message;
	}

	private ServerResponse(int status, T data) {
		this(status);
		this.data = data;
	}

	private ServerResponse(int status, String message, T data) {
		this(status, message);
		this.data = data;
	}

	public int getStatus() {
		return status;
	}

	public String getMessage() {
		return message;
	}

	public T getData() {
		return data;
	}

	@JsonIgnore
	// 不进行序列化操作
	public boolean isSuccess() {
		return status == ResponseCode.SUCCESS.getCode();
	}

	/*
	 * 为返回正确的响应构造四种不同的方法，提供不同 的 正确的 响应
	 */
	public static <T> ServerResponse<T> createBySuccess() {
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
	}

	public static <T> ServerResponse<T> createBySuccess(String message) {
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), message);
	}

	public static <T> ServerResponse<T> createBySuccess(T data) {
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), data);
	}

	public static <T> ServerResponse<T> createBySuccess(String message, T data) {
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), message, data);
	}

	/*
	 * 提供三种 返回错误 消息的 方法， 因为错误时不需要返回 data， 所以少两个方法
	 */
	public static <T> ServerResponse<T> createByError() {
		return new ServerResponse<T>(ResponseCode.ERROR.getCode());
	}

	public static <T> ServerResponse<T> createByError(String message) {
		return new ServerResponse<T>(ResponseCode.ERROR.getCode(), message);
	}

	public static <T> ServerResponse<T> createByError(T data) {
		return new ServerResponse<T>(ResponseCode.ERROR.getCode(), data);
	}

	/*
	 * 供其他情况使用， 比如 need_login， ILLEGAL_LOGIN 情况使用
	 */
	public static <T> ServerResponse<T> createByError(int status, String message) {
		return new ServerResponse<T>(status, message);
	}

	public static <T> ServerResponse<T> createByError(String message, T data) {
		return new ServerResponse<T>(ResponseCode.ERROR.getCode(), message, data);
	}

}
